home *** CD-ROM | disk | FTP | other *** search
/ Games of Daze / Infomagic - Games of Daze (Summer 1995) (Disc 1 of 2).iso / x2ftp / msdos / iguana / incosrc / incosrc.exe / SPI / SPI.ASM < prev    next >
Assembly Source File  |  1994-06-09  |  32KB  |  1,233 lines

  1. ; ------------------------------ SPI.ASM ---------------------
  2. ; Spiral.
  3. ; (C) 1993 bye JARE.
  4.  
  5. TRACE  = 0
  6.  
  7.         .MODEL SMALL
  8.         .STACK 1400
  9.         .386P
  10.         DOSSEG
  11.         LOCALS
  12.         JUMPS
  13.  
  14. INCLUDE VGASM.INC
  15. INCLUDE VBLIB.INC
  16. INCLUDE VTASM.INC
  17.  
  18.  
  19. SCRW     = 80
  20. SPIRALH  = 197
  21. POS1     = 35*2
  22.  
  23.         .DATA
  24.  
  25. SP01 SEGMENT PARA PUBLIC
  26.    EXTRN SPIRALPIX: BYTE
  27. ENDS
  28.  
  29. DGROUP GROUP SP01
  30.  
  31. ;==================================================
  32.  
  33. SetDisplayPage MACRO p
  34.         MOV     BX,p
  35.         MOV     DX,3D4h                 ; Set the display page.
  36.         MOV     AL,0Ch
  37.         MOV     AH,BH
  38.         OUT     DX,AX
  39.         INC     AL
  40.         MOV     AH,BL
  41.         OUT     DX,AX
  42. ENDM
  43.  
  44. WaitStatic MACRO c
  45.         LOCAL   @@w1
  46.         MOV     CX,c
  47. ;MOV CX,1
  48.       @@w1:
  49.         PUSH    CX
  50.         CALL    VBLVSync
  51.         CALL    CallMusic
  52.         POP     CX
  53.         LOOP    @@w1
  54. ENDM
  55.  
  56. ; Macros para volcar las espirales.
  57.  
  58. DumpBigSpiral MACRO p
  59.         MOV     [PixelationSkipOffset],SCRW
  60.         MOV     BX,-SPIRALH
  61.         MOV     DI,(200*p+1)*SCRW+(160-SPIRALH/2) / 4
  62.         MOV     AH,1 SHL ((160-SPIRALH/2) MOD 4)
  63.         CALL    PixelateBitmap
  64. ENDM
  65.  
  66.  
  67. DumpFirstSpiral MACRO p
  68.         MOV     [PixelationSkipOffset],0
  69.         MOV     BX,POS1
  70.         MOV     DI,p*200*SCRW
  71.         MOV     AH,1 SHL (0 MOD 4)
  72.         CALL    PixelateBitmap
  73. ENDM
  74.  
  75. DumpSecondSpiral MACRO p
  76.         MOV     [PixelationSkipOffset],0
  77.         MOV     BX,-POS1
  78.         MOV     DI,p*200*SCRW + (320-POS1) / 4
  79.         MOV     AH,1 SHL ((320-POS1) MOD 4)
  80.         CALL    PixelateBitmap
  81. ENDM
  82.  
  83. DumpThirdSpiral MACRO p
  84.         MOV     [PixelationSkipOffset],SCRW
  85.         MOV     BX,-POS1
  86.         MOV     DI,p*200*SCRW + SCRW*(200-POS1)
  87.         MOV     AH,1 SHL (0 MOD 4)
  88.         CALL    PixelateBitmap
  89. ENDM
  90.  
  91. DumpFourthSpiral MACRO p
  92.         MOV     [PixelationSkipOffset],SCRW
  93.         MOV     BX,POS1
  94.         MOV     DI,p*200*SCRW + SCRW*(200-POS1)+(320-POS1) / 4
  95.         MOV     AH,1 SHL ((320-POS1) MOD 4)
  96.         CALL    PixelateBitmap
  97. ENDM
  98.  
  99.  
  100. SetFirstColor MACRO p
  101.         MOV     BYTE PTR [FadeData&p],AL
  102.         MOV     BYTE PTR [FadeData&p+1],AL
  103.         MOV     BYTE PTR [FadeData&p+2],AH
  104.         MOV     BYTE PTR [FadeData&p+3],AL
  105.         MOV     BYTE PTR [FadeData&p+4],AH
  106.         MOV     BYTE PTR [FadeData&p+5],AL
  107.         SHR     AL,1
  108.         MOV     [CenterColor&p],AL
  109.         MOV     [CenterColor&p+1],AL
  110.         MOV     [CenterColor&p+2],AL
  111. ENDM
  112.  
  113. SetSecondColor MACRO p
  114.         MOV     BYTE PTR [FadeData&p],AL
  115.         MOV     BYTE PTR [FadeData&p+1],AH
  116.         MOV     BYTE PTR [FadeData&p+2],AL
  117.         MOV     BYTE PTR [FadeData&p+3],AH
  118.         MOV     BYTE PTR [FadeData&p+4],AH
  119.         MOV     BYTE PTR [FadeData&p+5],AL
  120. ;        SHR     AL,1
  121.         MOV     [CenterColor&p],AL
  122.         MOV     [CenterColor&p+1],AH
  123.         MOV     [CenterColor&p+2],AL
  124. ENDM
  125.  
  126.  
  127. ;===================================================
  128.  
  129.         .CODE
  130.  
  131. A_GDT   label   byte
  132.     NullDes    dw    0, 0, 0, 0
  133.     CodeDes    dw    0ffffh        ; limit (bits 24-31)
  134.         db    0, 0, 0        ; base (bits 0-23)
  135.         db    10011011B    ; present / DPL 0 / code / non conforming / readable
  136.         db    11001111B    ; size 4Gb / 32 bits / limit
  137.         db    0        ; base
  138.     DataDes    dw    0ffffh        ; limit (bits 24-31)
  139.         db    0, 0, 0        ; base (bits 0-23)
  140.         db    10010011B    ; present / DPL 0 / data / writeable
  141.         db    10001111B    ; size 4Gb / 32 bits / limit
  142.         db    0        ; base
  143.  
  144. A_GDT_PTR       dw      17h             ; gdt size
  145.                 dd      0               ; gdt linear base
  146.  
  147. ;===================================================
  148.  
  149.  
  150.         .CODE
  151.         .STARTUP       
  152.  
  153.         MOV     AH,1
  154.         INT     16h
  155.         JZ      @@dospi
  156.          XOR    AH,AH
  157.          INT    16h
  158.          MOV    AX,4C00h
  159.          INT    21h
  160.  
  161.     @@dospi:
  162.         CLD
  163.  
  164.  
  165. ; Protected mode fixup. Some programs like TLink from Borland leave the
  166. ; 386 segment registers unusable. This is to get them back.
  167.  
  168.         SMSW    AX
  169.         TEST    AX,1
  170.         JNZ     @@alreadyPM     ; Do not fix if we are already in PM.
  171.  
  172.         PUSH    CS
  173.         SUB     EAX,EAX
  174.         POP     AX
  175.         SHL     EAX,4
  176.         ADD     EAX,OFFSET A_GDT
  177.         MOV     DWORD PTR CS:[A_GDT_PTR].2,EAX
  178.  
  179.         LGDT    QWORD PTR CS:A_GDT_PTR
  180.  
  181.         SMSW    AX
  182.         OR      AX,1
  183.         LMSW    AX                      ; now running on protected mode
  184.  
  185.         JMP     @@ll1                   ; clear prefetch queue
  186. @@ll1:
  187.  
  188.         MOV     AX,10h                 ; adjust data selectors
  189.         MOV     GS,AX
  190.         MOV     FS,AX
  191.  
  192.         MOV     EAX,CR0
  193.         AND     EAX,0FFFFFFFEh
  194.         MOV     CR0,EAX                ; now running on real mode
  195.  
  196.         JMP     @@ll2                   ; clear prefetch queue
  197. @@ll2:
  198.                        
  199.         XOR     AX,AX
  200.         MOV     FS,AX
  201.         MOV     GS,AX
  202.  
  203. @@alreadyPM:
  204.  
  205. ; End of PM fixup.
  206.  
  207.         CALL    SetupSpiralVideo
  208.         SetDisplayPage 0
  209.         VSync
  210.  
  211.         MOV     CS:[VBLFullHandler],OFFSET SpiralFullHandler
  212.         XOR     SI,SI
  213.         CALL    InitializeTimerVBL
  214.         CALL    VBLVSync
  215.  
  216.         CALL    InitMusic
  217.         CALL    VTDisconnectTimer
  218. ;        CALL    VTBeginSync
  219. ;        CALL    VTWaitForStart
  220.  
  221.         MOV     BX,6
  222.         MOV     DH,9
  223.         MOV     DL,49
  224.         CALL    VTMiddleSync
  225.  
  226.         WaitStatic 100
  227.  
  228.         DumpFirstSpiral 0
  229.         DumpFirstSpiral 1
  230.         DumpSecondSpiral 0
  231.         DumpSecondSpiral 1
  232.         DumpThirdSpiral 1
  233.         DumpFourthSpiral 1
  234.  
  235.         CALL    FlipSpiralColors
  236.         
  237.         DumpThirdSpiral 0
  238.         DumpFourthSpiral 0
  239.  
  240.         MOV     CX,32
  241.     @@l1:
  242.         PUSH    CX
  243.         CALL    VBLVSync
  244.         CALL    CallMusic
  245.         CALL    VBLVSync
  246.         CALL    CallMusic
  247.         POP     CX
  248.         PUSH    CX
  249.         MOV     AX,32
  250.         SUB     AL,CL
  251.         SetFirstColor 1
  252.         POP     CX
  253.         LOOP    @@l1
  254.  
  255.         MOV     CX,32
  256.     @@l2:
  257.         PUSH    CX
  258.         CALL    VBLVSync
  259.         CALL    CallMusic
  260.         CALL    VBLVSync
  261.         CALL    CallMusic
  262.         POP     CX
  263.         PUSH    CX
  264.         MOV     AX,64
  265.         SUB     AL,CL
  266.         SetFirstColor 1
  267.         MOV     AX,32
  268.         SUB     AL,CL
  269.         SetFirstColor 2
  270.         POP     CX
  271.         LOOP    @@l2
  272.  
  273.         MOV     CX,32
  274.     @@l3:
  275.         PUSH    CX
  276.         CALL    VBLVSync
  277.         CALL    CallMusic
  278.         CALL    VBLVSync
  279.         CALL    CallMusic
  280.         POP     CX
  281.         PUSH    CX
  282.         MOV     AX,64
  283.         SUB     AL,CL
  284.         SetFirstColor 2
  285.         POP     CX
  286.         LOOP    @@l3
  287.  
  288.         WaitStatic 100
  289.  
  290.         MOV     CX,64
  291.      @@w3:
  292.         PUSH    CX
  293.         MOV     CX,128
  294.         MOV     DI,OFFSET NormalPalette+128*3
  295.         XOR     DX,DX
  296.         CALL    FadeCol
  297.         CALL    VBLVSync
  298.         MOV     CX,64
  299.         MOV     SI,OFFSET NormalPalette+(128+64)*3
  300.         MOV     AL,128+64
  301.         CALL    DumpPalette
  302.         CALL    CallMusic
  303.         CALL    VBLVSync
  304.         MOV     CX,64
  305.         MOV     SI,OFFSET NormalPalette+128*3
  306.         MOV     AL,128
  307.         CALL    DumpPalette
  308.         CALL    CallMusic
  309.         POP     CX
  310.         LOOP    @@w3
  311.  
  312.         CALL    CallMusic
  313.         CALL    VBLVSync
  314.         CALL    CallMusic
  315.         CALL    VBLVSync
  316.         MOV     AL,[SpiralPos1]
  317.         MOV     [SpiralPos2],AL
  318.         XOR     AX,AX
  319.         SetFirstColor 2
  320.         SetDisplayPage 200*SCRW
  321.         WaitStatic 100
  322.         CALL    CallMusic
  323.         CALL    CallMusic
  324.         CALL    CallMusic
  325.         DumpBigSpiral 0
  326.         CALL    VBLVSync
  327.         CALL    CallMusic
  328.         CALL    VBLVSync
  329.         CALL    CallMusic
  330.         CALL    CallMusic
  331.         CALL    CallMusic
  332.         DumpBigSpiral 1
  333.         CALL    CallMusic
  334.         CALL    FlipSpiralColors
  335.         CALL    CallMusic
  336.         DumpThirdSpiral 0
  337.         CALL    CallMusic
  338.         DumpFourthSpiral 0
  339.         MOV     [SecondPalRot],OFFSET PalDec
  340.  
  341.         MOV     [SpecialSecondPal],1
  342.  
  343.         MOV     CX,64
  344.       @@w4:
  345.         PUSH    CX
  346.         MOV     AX,64
  347.         SUB     AL,CL
  348.         SetSecondColor 2
  349.         CALL    VBLVSync
  350.         CALL    CallMusic
  351.         CALL    VBLVSync
  352.         CALL    CallMusic
  353.         POP     CX
  354.         LOOP    @@w4
  355.         
  356.         WaitStatic 100
  357.  
  358.         ;-----------------
  359.  
  360.         SetDisplayPage 0
  361.         CALL    VBLVSync
  362.         CALL    CallMusic
  363.         CALL    CallMusic
  364.         CALL    CallMusic
  365.         CALL    CallMusic
  366.         CALL    CopyScreen123
  367.  
  368.         MOV     CX,1258
  369. RotationLoop:
  370.         PUSH    CX
  371.         CALL    VBLVSync
  372.         CALL    SetSpiDisplayPage
  373.         INC     [FrameCounter]
  374.         CMP     [FrameCounter],3
  375.         JC      @@1
  376.          MOV    [FrameCounter],0
  377.    @@1:
  378.         SetBorder 63,0,0
  379.         CALL    EraseSpiral
  380.         SetBorder 0, 63, 0
  381.         CALL    CallMusic
  382.         CALL    DrawRotatingSpiral
  383.         SetBorder 0, 63, 63
  384.  
  385.         ADD     [SpiralPosRot],6
  386.         CMP     [SpiralPosRot], OFFSET CircleByeBye
  387.         JC      @@c1
  388.          MOV    [SpiralPosRot], OFFSET CirclePosition
  389.      @@c1:
  390.         CALL    CallMusic
  391.         MOV     AH,1
  392.         INT     16h
  393.         JNZ     FinalKey
  394.         POP     CX
  395.         LOOP    RotationLoop
  396.  
  397.         MOV     [SpiralPosRot],OFFSET CircleByeBye
  398.         MOV     CX,58
  399. ByeByeLoop:
  400.         PUSH    CX
  401.         CALL    VBLVSync
  402.         CALL    SetSpiDisplayPage
  403.         INC     [FrameCounter]
  404.         CMP     [FrameCounter],3
  405.         JC      @@1
  406.          MOV    [FrameCounter],0
  407.    @@1:
  408.         SetBorder 63,0,0
  409.         CALL    EraseSpiral
  410.         SetBorder 0, 63, 0
  411.         CALL    CallMusic
  412.         CALL    DrawRotatingSpiral
  413.         SetBorder 0, 63, 63
  414.  
  415.         ADD     [SpiralPosRot],6
  416.         CALL    CallMusic
  417.         MOV     AH,1
  418.         INT     16h
  419.         JNZ     FinalKey
  420.         POP     CX
  421.         LOOP    ByeByeLoop
  422.  
  423.         SUB     [SpiralPosRot],6
  424.         MOV     CX,210
  425.    WaitLoop:
  426.         PUSH    CX
  427.         CALL    VBLVSync
  428.         CALL    SetSpiDisplayPage
  429.         INC     [FrameCounter]
  430.         CMP     [FrameCounter],3
  431.         JC      @@1
  432.          MOV    [FrameCounter],0
  433.    @@1:
  434.         CALL    CallMusic
  435.         CALL    EraseSpiral
  436.         CALL    CallMusic
  437.         MOV     AH,1
  438.         INT     16h
  439.         JNZ     FinalKey
  440.         POP     CX
  441.         LOOP    WaitLoop
  442.  
  443.         MOV     CX,64
  444. FadeLoop:
  445.         PUSH    CX
  446.         MOV     AX,CX
  447.         DEC     AX
  448.         SetFirstColor  1
  449.         MOV     AX,CX
  450.         DEC     AX
  451.         SetSecondColor 2
  452.         CALL    VBLVSync
  453.         CALL    CallMusic
  454.         POP     CX
  455.         LOOP    FadeLoop
  456.         JMP     Quitting
  457.  
  458. FinalKey:
  459.         XOR     AH,AH
  460.         INT     16h
  461.  
  462. Quitting:
  463.  
  464. ByeBye:
  465.         CALL    EndTimerVBL
  466.  
  467.         CALL    VTConnectTimer
  468. COMMENT #
  469.         CALL    ZeroPalette
  470.         MOV     AX,3
  471.         INT     10h
  472. #
  473.         CALL    RestoreSystemTime
  474.  
  475.         MOV     AX,4C00h
  476.         INT     21h
  477.  
  478.  
  479. ; =======================================
  480.  
  481. PalInc:
  482.         INC     BL
  483.         CMP     BL,50
  484.         JC      @@1
  485.          XOR    BL,BL
  486.       @@1:
  487.         RET
  488.  
  489. PalDec:
  490.         DEC     BL
  491.         CMP     BL,50
  492.         JC      @@1
  493.          MOV    BL,49
  494.      @@1:
  495.         RET
  496.  
  497. SpiralFullHandler:
  498.         PUSH    DS
  499.         MOV     AX,@data
  500.         MOV     DS,AX
  501.         PUSHA
  502.  
  503.         MOV     SI,OFFSET SpiralPalette
  504.         MOV     CX,50
  505.         MOV     AL,1
  506.         CALL    DumpPalette
  507.  
  508.         CMP     [WorkSecondPal],0
  509.         JZ      @@c1
  510.          MOV    SI,OFFSET SpiralPalette+50*3
  511.          MOV    CX,50
  512.          MOV    AL,51
  513.          CALL   DumpPalette
  514.      @@c1:
  515.  
  516.         MOV     SI,OFFSET CenterColor1
  517.         MOV     CX,2
  518.         MOV     AL,101
  519.         CALL    DumpPalette
  520.      
  521.         MOV     DI,OFFSET SpiralPalette
  522.         MOV     BL,[SpiralPos1]
  523.         MOV     DX,[FadeData1]
  524.         MOV     CX,[FadeData1+2]
  525.         MOV     AX,[FadeData1+4]
  526.         CALL    GenerateSpiPal
  527.         CALL    [WORD PTR FirstPalRot]
  528.         MOV     [SpiralPos1],BL
  529.  
  530.         CMP     [WorkSecondPal],0
  531.         JZ      @@c4
  532.          MOV    DI,OFFSET SpiralPalette+3*50
  533.          MOV    BL,[SpiralPos2]
  534.          MOV    DX,[FadeData2]
  535.          MOV    CX,[FadeData2+2]
  536.          MOV    AX,[FadeData2+4]
  537.          CMP    [SpecialSecondPal],1
  538.          JNZ    @@normspal
  539.           CALL  GenerateGraySpiral
  540.           JMP   @@gc1
  541.       @@normspal:
  542.          CALL   GenerateSpiPal
  543.       @@gc1:
  544.          CALL   [WORD PTR SecondPalRot]
  545.          MOV    [SpiralPos2],BL
  546.      @@c4:
  547.  
  548.         POPA
  549.         POP     DS
  550.         RET
  551.  
  552. GenerateSpiPal:
  553.         PUSH    BX
  554.         MOV     SI,50
  555.       @@l1:
  556.          CMP    BL,25
  557.          JC     @@other
  558.           MOV   BYTE PTR [DI],DH
  559.           MOV   BYTE PTR [DI+1],CH
  560.           MOV   BYTE PTR [DI+2],AH
  561.           JMP   SHORT @@goon
  562.       @@other:
  563.           MOV   BYTE PTR [DI],DL
  564.           MOV   BYTE PTR [DI+1],CL
  565.           MOV   BYTE PTR [DI+2],AL
  566.       @@goon:
  567.          INC    BL
  568.          CMP    BL,50
  569.          JC     @@c2
  570.           XOR   BL,BL
  571.       @@c2:
  572.          ADD    DI,3
  573.          DEC    SI
  574.          JNZ    @@l1
  575.          POP    BX
  576.          RET
  577.  
  578. GenerateGraySpiral:
  579.         PUSH    BX
  580.         CMP     BL,25
  581.         JC      @@down
  582.  SUB    DL,50
  583.  ADD    DL,BL
  584.          SUB    DL,50
  585.          ADD    DL,BL
  586.          JMP    SHORT @@gc0
  587.     @@down:
  588.  SUB    DL,BL
  589.          SUB    DL,BL
  590.     @@gc0:
  591.         MOV     SI,50
  592.       @@l1:
  593.          MOV    DH,DL
  594.          TEST   DH,80h
  595.          JZ     @@set
  596.           XOR   DH,DH
  597.       @@set:
  598.          MOV    BYTE PTR [DI],0 ;DH
  599.          MOV    BYTE PTR [DI+1],DH
  600.          MOV    BYTE PTR [DI+2],0 ;DH
  601.          CMP    BL,25
  602.          JC     @@other
  603.   ADD   DL,2
  604.           ADD   DL,2
  605.       @@other:
  606.   DEC   DL
  607.           DEC   DL
  608.          INC    BL
  609.          CMP    BL,50
  610.          JC     @@c2
  611.           XOR   BL,BL
  612.       @@c2:
  613.          ADD    DI,3
  614.          DEC    SI
  615.          JNZ    @@l1
  616.          POP    BX
  617.          RET
  618.  
  619. ; =======================================
  620.  
  621. SetupSpiralVideo:
  622. COMMENT #
  623.         CALL    ZeroPalette
  624.         MOV     AX,13h
  625.         INT     10h
  626.         CALL    ZeroPalette
  627.         VSync
  628.  
  629.         MOV     DX,3D4h                 ; Set the display page to 0.
  630.         MOV     AL,0Ch
  631.         XOR     AH,AH
  632.         OUT     DX,AX
  633.         INC     AL
  634.         OUT     DX,AX
  635.  
  636.         VSync
  637.  
  638.         ; Setup the video addressing mode.
  639.  
  640.         MOV     DX,3C0h
  641.         MOV     AL,30h
  642.         OUT     DX,AL
  643.         MOV     AL,01100001b
  644.         OUT     DX,AL 
  645.  
  646.         MOV     DX,3c4h
  647.         MOV     AX,604h                 ; "Unchain my heart". And my VGA...
  648.         OUT     DX,AX
  649.         MOV     AX,0F02h                ; All planes
  650.         OUT     DX,AX
  651.         
  652.         ; Comienzo del modo de Hz reducidos.
  653.  
  654.         MOV     DX,3D4h
  655.         MOV     CX,18h
  656.         MOV     SI,OFFSET CRTCregs
  657.      @@cl1:
  658.          LODSW
  659.          OUT    DX,AX
  660.          LOOP   @@cl1
  661.  
  662.         ; Final del modo de Hz reducidos.
  663.  
  664.         MOV     AX,14h                  ; Disable dword mode
  665.         OUT     DX,AX
  666.         MOV     AX,0E317h               ; Enable byte mode.
  667.         OUT     DX,AX
  668.  
  669.         MOV     DX,3C4h
  670.         MOV     AX,0F02h                ; All planes at a time.
  671.         OUT     DX,AX
  672.  
  673.         MOV     DX,3CEh                 ; Bitmask...
  674.         MOV     AX,0FF08h ;00008h               ; 00000000b
  675.         OUT     DX,AX
  676.  
  677. ;        VSync
  678.  
  679.         MOV     AX,0A000h
  680.         MOV     ES,AX
  681.         MOV     SI,SCRW*(216*2 + 16)
  682.  
  683.         MOV     DI,0
  684.         MOV     CX,8000h
  685.         XOR     AX,AX
  686.         REP STOSW
  687.  
  688.         MOV     DI,0
  689.         MOV     CX,200*SCRW/2
  690.     MOV  AX,0A0B0H
  691.         REP STOSW
  692.  
  693. ;#
  694.         MOV     DX,3CEh                 ; Bitmask...
  695.         MOV     AX,0FF08h               ; 11111111b
  696.         OUT     DX,AX
  697.  
  698.         MOV     SI,OFFSET NormalPalette
  699.         MOV     CX,256
  700.         XOR     AL,AL
  701.         CALL    DumpPalette
  702.  
  703.         RET
  704.  
  705. ; =======================================
  706.  
  707. GetRandomNumber:
  708.         MOV     AX,[RandSeed]
  709.         MOV     BX,[RandSeed2]
  710.         MOV     BP,[RandSeed3]
  711.         ADD     AX,0a137h
  712.         ADD     BX,63f7h
  713.         ADD     BP,784Ah
  714.         ROL     AX,2
  715.         MOV     [RandSeed],AX
  716.         ADD     BX,AX
  717.         ROR     BX,1
  718.         MOV     [RandSeed2],BX
  719.         SUB     BP,BX
  720.         XOR     AX,BP
  721.         MOV     [RandSeed3],BP
  722.         ADD     AX,BX
  723.         RET
  724.  
  725.  
  726. ; =======================================
  727. ; En BX se le da el tamaño de destino.
  728. ; En DI la dirección final de la pantalla.
  729. ; En AH el bitplane de inicio.
  730.  
  731.         .DATA
  732.         EVENDATA
  733. ScaleHData       DW 320 DUP (?)
  734. ScaleVData       DW 320 DUP (?)
  735.  
  736.         .CODE
  737.  
  738. PixelateBitmap:
  739.         MOV     AL,AH
  740.         ROR     AL,4
  741.         OR      AH,AL
  742.         PUSH    AX
  743.         PUSH    DI
  744.         MOV     DI,OFFSET ScaleVData
  745.         MOV     SI,OFFSET ScaleHData
  746.         OR      BX,BX
  747.         JNS     @@c1
  748.          XCHG   SI,DI
  749.          NEG    BX
  750.      @@c1:
  751.         PUSH    SI
  752.         PUSH    BX
  753.         CALL    ScaleVSize
  754.         POP     BX
  755.         POP     DI
  756.         PUSH    BX
  757.         CALL    ScaleHSize
  758.         SetBorder 63,0,0
  759.         MOV     AX,0A000h
  760.         MOV     ES,AX
  761.         POP     CX
  762.         POP     DI
  763.         POP     AX
  764.         MOV     BP,CX
  765.         MOV     BX,OFFSET ScaleHData
  766.         MOV     SI,OFFSET DGROUP:SPIRALPIX
  767.  
  768.     @@lh:
  769.          PUSH   CX
  770.          PUSH   DI
  771.          PUSH   AX
  772.          PUSH   SI
  773.          PUSH   BX
  774.          MOV    DX,3C4h
  775.          MOV    AL,02h                ; One plane at a time.
  776.          OUT    DX,AX
  777.          MOV    BX,OFFSET ScaleVData
  778.          MOV    CX,BP
  779.          PUSH   BP
  780.          MOV    BP,[PixelationSkipOffset]
  781.          MOV    AX,2
  782.      @@skip:
  783.           MOV   DL,[SI]
  784.           ADD   SI,[BX]
  785.           ADD   DI,BP
  786.           ADD   BX,AX
  787.           DEC   CX
  788.           JZ    @@bail
  789.           OR    DL,DL
  790.           JZ    @@skip
  791.           MOV   BP,SCRW
  792.           JMP   @@lv
  793.         @@bail:
  794.            JMP  @@nxc
  795.         @@lv:
  796.           REPT 4
  797.              MOV   DL,[SI]
  798.              OR    DL,DL
  799.              JZ    @@bail
  800.              MOV   ES:[DI],DL
  801.              ADD   DI,BP
  802.              ADD   SI,[BX]
  803.              ADD   BX,AX
  804.              DEC   CX
  805.              JZ    @@nxc
  806.           ENDM
  807.           JMP   @@lv
  808.       @@nxc:
  809.          POP    BP
  810.          POP    BX
  811.          POP    SI
  812.          POP    AX
  813.          POP    DI
  814.          ADD    SI,[BX]
  815.          ADD    BX,2
  816.          ROL    AH,1
  817.          JNC    @@goon
  818.           INC   DI
  819.       @@goon:
  820.          POP    CX
  821.          LOOP   @@lh
  822.         SetBorder 0, 0, 63
  823.         RET
  824.  
  825. ; =======================================
  826. ; En BX se le da el tamaño de destino.
  827. ; En DI la zona donde dejar los datos.
  828.  
  829. ScaleVSize:
  830.         PUSH    BX
  831.         XOR     AX,AX
  832.         MOV     DX,SPIRALH
  833.         CMP     DX,BX
  834.         JC      @@nored
  835.          XCHG   DX,AX           ; Must reduce the bitmap, skipping points.
  836.          DIV    BX
  837.   @@nored:
  838.            ; AX == incremento constante.
  839.            ; DX == incremento residual.
  840.            ; BX == modulo del residual.
  841.         PUSH    DX
  842.         MOV     DX,SPIRALH      ; Escala el inc cte.
  843.         MUL     DX
  844.         POP     DX
  845.  
  846.         POP     CX
  847.         MOV     SI,AX
  848.         MOV     BP,BX
  849.         SHR     BP,1
  850.      @@lp:
  851.         MOV     [DI],SI
  852.         SUB     BP,DX
  853.         JNC     @@norm
  854.          ADD    BP,BX
  855.          ADD    WORD PTR [DI],SPIRALH
  856.      @@norm:
  857.         ADD     DI,2
  858.         LOOP    @@lp
  859.         RET
  860.  
  861. ; =======================================
  862. ; En BX se le da el tamaño de destino.
  863. ; En DI la zona donde dejar los datos.
  864.  
  865. ScaleHSize:
  866.         PUSH    BX
  867.         XOR     AX,AX
  868.         MOV     DX,SPIRALH
  869.         CMP     DX,BX
  870.         JC      @@nored
  871.          XCHG   DX,AX           ; Must reduce the bitmap, skipping points.
  872.          DIV    BX
  873.   @@nored:
  874.            ; AX == incremento constante.
  875.            ; DX == incremento residual.
  876.            ; BX == modulo del residual.
  877.  
  878.         POP     CX
  879.         MOV     SI,AX
  880.         MOV     BP,BX
  881.         SHR     BP,1
  882.      @@lp:
  883.         MOV     [DI],SI
  884.         SUB     BP,DX
  885.         JNC     @@norm
  886.          ADD    BP,BX
  887.          ADD    WORD PTR [DI],1
  888.      @@norm:
  889.         ADD     DI,2
  890.         LOOP    @@lp
  891.         RET
  892.  
  893. ; =======================================
  894.  
  895. FlipEm MACRO r
  896.         LOCAL @@d1, @@d2, @@d3, @@go
  897.         OR      r,r
  898.         JZ      @@go
  899.         CMP     r,51
  900.         JC      @@d1
  901.         CMP     r,101
  902.         JC      @@d2
  903.         JZ      @@d3
  904.          SUB    r,1+50
  905.      @@d1:
  906.         ADD     r,50+50
  907.      @@d2:
  908.         SUB     r,50+1
  909.      @@d3:
  910.         INC     r
  911.      @@go:
  912. ENDM
  913.  
  914. FlipSpiralColors:
  915.         MOV     SI,OFFSET DGROUP:SP01
  916.         MOV     CX,197*197 / 2
  917.     @@l1:
  918.         MOV     AX,[SI]
  919.         FlipEm AL
  920.         FlipEm AH
  921.         MOV     [SI],AX
  922.         ADD     SI,2
  923.         LOOP    @@l1
  924.         MOV     AL,[SI]
  925.         FlipEm AL
  926.         MOV     [SI],AL
  927.        RET
  928.  
  929. ; =======================================
  930.  
  931. DOCopy:
  932.         PUSH    DS
  933.         MOV     AX,0A000h
  934.         MOV     DS,AX
  935.         MOV     ES,AX
  936.         MOV     CX,SCRW*200
  937.         MOV     SI,200*SCRW
  938.         REP MOVSB
  939.         POP     DS
  940.         RET
  941.  
  942. CopyScreen123:
  943.         MOV     DX,3C4h
  944.         MOV     AX,0F02h                ; All planes at a time.
  945.         OUT     DX,AX
  946.         MOV     DX,3CEh                 ; Bitmask...
  947.         MOV     AX,00008h               ; 00000000b
  948.         OUT     DX,AX
  949.  
  950.         MOV     DI,200*SCRW*0
  951. ;        CALL    DOCopy
  952.         CALL    CallMusic
  953.         CALL    CallMusic
  954.         CALL    CallMusic
  955.         MOV     DI,200*SCRW*2
  956.         CALL    DOCopy
  957.         CALL    CallMusic
  958.         CALL    CallMusic
  959.         CALL    CallMusic
  960.         MOV     DI,200*SCRW*3
  961.         CALL    DOCopy
  962.  
  963.         MOV     DX,3CEh                 ; Bitmask...
  964.         MOV     AX,0FF08h               ; 11111111b
  965.         OUT     DX,AX
  966.         RET
  967.  
  968. ; =======================================
  969. ; Pone la espiralilla de tamaño BX
  970. ; en el punto de centro SI,DI.
  971. ; Base de la pantalla en BP.
  972. ; Retorna en DI el OFFSET donde la pintó.
  973.  
  974. DrawSpiralXY:
  975.         MOV     AX,BX
  976.         CMP     AX,0
  977.         JGE     @@c1
  978.          NEG    AX
  979.      @@c1:
  980.         SHR     AX,1
  981.         SUB     SI,AX
  982.         SUB     DI,AX
  983.         MOV     AX,SCRW
  984.         MUL     DI
  985.         MOV     DI,AX
  986.         MOV     CX,SI
  987.         SHR     SI,2
  988.         ADD     DI,SI
  989.         AND     CL,3
  990.         MOV     AH,1
  991.         SHL     AH,CL
  992.         PUSH    DI
  993.         ADD     DI,BP
  994.         CALL    PixelateBitmap
  995.         POP     DI
  996.         RET
  997.  
  998. ; =======================================
  999.  
  1000. EraseSpiral:
  1001.         PUSH    DS
  1002.         TEST    [FrameCounter],2
  1003.         JZ      SHORT @@frame2
  1004.          MOV    BP,SCRW*200*2                   ; 2 -> 2
  1005.          MOV    DI,OFFSET SpiPosScr2
  1006.         JMP     SHORT @@endframe
  1007.     @@frame2:
  1008.         TEST    [FrameCounter],1
  1009.         JZ      SHORT @@frame3
  1010.          MOV    BP,SCRW*200*1                   ; 1 -> 1
  1011.          MOV    DI,OFFSET SpiPosScr1
  1012.         JMP     SHORT @@endframe
  1013.     @@frame3:
  1014.          MOV    BP,SCRW*200*0                   ; 0 -> 0
  1015.          MOV    DI,OFFSET SpiPosScr0
  1016.     @@endframe:
  1017.         MOV     DX,3C4h
  1018.         MOV     AX,0F02h                ; All planes at a time.
  1019.         OUT     DX,AX
  1020.         MOV     DX,3CEh                 ; Bitmask...
  1021.         MOV     AX,00008h               ; 00000000b
  1022.         OUT     DX,AX
  1023.  
  1024. ;        MOV     CX,57
  1025.         MOV     CX,[DI+2]
  1026.         MOV     DI,[DI]
  1027.         MOV     SI,DI
  1028.         ADD     DI,BP
  1029.         ADD     SI,SCRW*200*3
  1030.         MOV     AX,0A000h
  1031.         MOV     ES,AX
  1032.         MOV     DS,AX
  1033.       @@l1:
  1034.         
  1035.         REPT (57+3)/4
  1036.           MOVSB
  1037.         ENDM
  1038.         ADD     DI,SCRW-((57+3)/4)
  1039.         ADD     SI,SCRW-((57+3)/4)
  1040.         LOOP    @@l1
  1041.  
  1042.         POP     DS
  1043.         MOV     DX,3CEh                 ; Bitmask...
  1044.         MOV     AX,0FF08h               ; 11111111b
  1045.         OUT     DX,AX
  1046.         RET
  1047.  
  1048. ; =======================================
  1049.  
  1050. SetSpiDisplayPage:
  1051.         MOV     DX,3D4h
  1052.         MOV     BX,SCRW*200*2                   ; 2 -> 2
  1053.         TEST    [FrameCounter],2
  1054.         JNZ     SHORT @@scrst
  1055.          MOV    BX,SCRW*200*1                   ; 1 -> 1
  1056.          TEST   [FrameCounter],1
  1057.          JNZ    SHORT @@scrst
  1058.           MOV   BX,SCRW*200*0                   ; 0 -> 0
  1059.     @@scrst:
  1060.         MOV     AL,0Ch
  1061.         MOV     AH,BH
  1062.         OUT     DX,AX
  1063.         INC     AL
  1064.         MOV     AH,BL
  1065.         OUT     DX,AX
  1066.         RET
  1067.  
  1068.  
  1069. ; =======================================
  1070.  
  1071. DrawRotatingSpiral:
  1072.         TEST    [FrameCounter],2
  1073.         JZ      @@frame2
  1074.          MOV    SI,OFFSET SpiPosScr2
  1075.          MOV    BP,SCRW*200*2                   ; 2 -> 2
  1076.         JMP     SHORT @@endframe
  1077.     @@frame2:
  1078.         TEST    [FrameCounter],1
  1079.         JZ      @@frame3
  1080.          MOV    SI,OFFSET SpiPosScr1
  1081.          MOV    BP,SCRW*200*1                   ; 1 -> 1
  1082.         JMP     SHORT @@endframe
  1083.     @@frame3:
  1084.          MOV    SI,OFFSET SpiPosScr0
  1085.          MOV    BP,SCRW*200*0                   ; 0 -> 0
  1086.     @@endframe:
  1087.         PUSH    SI
  1088.         MOV     DI,[SpiralPosRot]
  1089.         MOV     BX,[DI+4]
  1090.         MOV     [SI+2],BX
  1091.         MOV     SI,[DI]
  1092.         MOV     DI,[DI+2]
  1093.         NEG     BX
  1094.         CALL    DrawSpiralXY
  1095.         POP     SI
  1096.         MOV     [SI],DI
  1097.         RET
  1098.  
  1099. ; =======================================
  1100. ; =======================================
  1101. ; =======================================
  1102. ; =======================================
  1103. ; =======================================
  1104. ; =======================================
  1105.  
  1106.  
  1107.         .DATA
  1108.  
  1109. CRTCregs LABEL BYTE                                               ; Modo 13h
  1110.   DB 11h, 04h       ; End   vertical retrace. (0-0Fh)             ; DB 11h, 8Eh
  1111.   DB 00h, 64h       ; Horizontal total.                           ; DB 00h, 5Fh
  1112.   DB 01h, 4Fh       ; Horizontal display enable end.              ; DB 01h, 4Fh
  1113.   DB 02h, 50h       ; Start horizontal blanking.                  ; DB 02h, 50h
  1114.   DB 03h, 80h+07h   ; End   horizontal blanking. (0-1Fh)          ; DB 03h, 82h
  1115.   DB 04h, 5Bh       ; Start horizontal retrace.                   ; DB 04h, 54h
  1116.   DB 05h, 80h+05h   ; End   horizontal retrace. (0-1Fh)           ; DB 05h, 80h
  1117.   DB 06h,0FFh       ; Vertical total. (+7.0 +7.5)                 ; DB 06h, BFh
  1118.   DB 07h, 00011111b ; Overflow (high bits of vertical registers). ; DB 07h, 1Fh
  1119.   DB 08h, 00h                                                     ; DB 08h, 00h
  1120.   DB 09h, 41h                                                     ; DB 09h, 41h
  1121.   DB 0Ah, 00h                                                     ; DB 0Ah, 00h
  1122.   DB 0Bh, 00h                                                     ; DB 0Bh, 00h
  1123.   DB 0Ch, 00h                                                     ; DB 0Ch, 00h
  1124.   DB 0Dh, 00h                                                     ; DB 0Dh, 00h
  1125.   DB 0Eh, 00h                                                     ; DB 0Eh, 00h
  1126.   DB 0Fh, 00h                                                     ; DB 0Fh, 00h
  1127.   DB 10h,0C0h       ; Start vertical retrace. (+7.2 +7.7)         ; DB 10h, 9Ch
  1128. ;                 
  1129. ;    11h      ────┘ ; End   vertical retrace. (0-0Fh)
  1130.   DB 12h, 8Fh       ; Vertical display enable end. (+7.1 +7.6)    ; DB 12h, 8Fh
  1131.   DB 13h, 28h                                                     ; DB 13h, 28h
  1132.   DB 14h, 40h                                                     ; DB 14h, 40h
  1133.   DB 15h,097h       ; Start vertical blanking. (+7.3 +9.5)        ; DB 15h, 96h
  1134.   DB 16h,0F8h       ; End   vertical blanking.                    ; DB 16h, B9h
  1135.   DB 17h,0A3h                                                     ; DB 17h, A3h
  1136.   DB 18h,0FFh                                                     ; DB 18h, FFh
  1137.  
  1138. ALIGN 2
  1139.  
  1140. FrameCounter DW 0
  1141. RandSeed     DW 348Bh
  1142. RandSeed2    DW 7F34h
  1143. RandSeed3    DW 32bfh
  1144.  
  1145. ALIGN 2
  1146.  
  1147. FadeCounter     DW 0
  1148.  
  1149. NormalPalette LABEL BYTE
  1150.  
  1151. ; ----- Normal Palette. ------------
  1152.  
  1153.         DB 0, 0, 0
  1154.         DB 50*2*3 DUP (0)
  1155. CenterColor1 LABEL BYTE
  1156.         DB 0, 0, 0
  1157. CenterColor2 LABEL BYTE
  1158.         DB 0, 0, 0
  1159.         DB (128-50*2-3)*3 DUP (0)
  1160.  
  1161.         DB   0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0
  1162.         DB   0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0
  1163.         DB   0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0
  1164.         DB   0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0
  1165.         DB   0,  0,  0,  0,  0,  0,  0,  0,  0
  1166. IguLogoFirstColor LABEL BYTE
  1167. ;        DB  31, 22, 33
  1168. ;        DB  28, 20, 30, 26, 17, 27, 24, 15, 24, 21, 12, 22
  1169. ;        DB  19, 10, 19
  1170.         DB 6*3 DUP (0)
  1171.         DB   3,  3,  3,  5,  5,  5,  7,  7,  7
  1172.         DB   9,  9,  9, 10, 10, 10, 12, 12, 12, 14, 14, 14
  1173.         DB  19, 10, 19, 21, 12, 22, 24, 15, 24, 26, 17, 27
  1174.         DB  31, 22, 33, 33, 24, 35, 41, 21, 29, 40, 19, 27
  1175.         DB  39, 17, 25, 38, 15, 23, 31, 10, 31, 33, 11, 33
  1176.         DB  35, 11, 35, 37, 12, 37, 39, 13, 39, 41, 13, 41
  1177.         DB  43, 14, 43, 45, 15, 45, 46, 15, 46, 48, 16, 48
  1178.         DB  50, 17, 50, 52, 17, 52, 54, 18, 54, 56, 19, 56
  1179.         DB  58, 19, 58, 60, 20, 60, 60, 19, 20, 60, 17, 16
  1180.         DB  60, 15, 12, 60, 10,  5, 59,  9,  5, 56,  9,  4
  1181.         DB  52,  8,  4, 49,  7,  4, 45,  7,  3, 41,  6,  3
  1182.         DB  38,  5,  3, 34,  5,  2, 31,  4,  2, 27,  3,  2
  1183.         DB  23,  3,  1, 20,  2,  1, 16,  1,  1, 13,  1,  0
  1184.         DB   9,  0,  0,  0,  5, 10,  0,  5, 12,  0,  5, 13
  1185.         DB   0,  5, 15,  0,  6, 17,  0,  6, 19,  0,  6, 20
  1186.         DB   0,  6, 22,  0,  6, 24,  0,  6, 25,  0,  7, 27
  1187.         DB   0,  7, 29,  0,  7, 31,  0,  7, 32,  0,  7, 34
  1188.         DB   0,  7, 36,  0,  8, 37,  0,  8, 39,  0,  8, 41
  1189.         DB   0,  8, 42,  0,  8, 44,  0,  8, 46,  0,  9, 48
  1190.         DB   0,  9, 49,  0,  9, 51,  0,  9, 53,  0,  9, 54
  1191.         DB   0,  9, 56,  0, 10, 58,  0, 10, 60,  0, 10, 61
  1192.         DB   0, 10, 63,  8, 20, 54, 12, 20, 56, 14, 22, 56
  1193.         DB  16, 24, 57, 18, 27, 57, 21, 29, 57,  0, 31, 63
  1194.         DB  10, 43, 43, 10, 41, 41, 10, 39, 39, 10, 37, 37
  1195.         DB  10, 35, 35, 10, 33, 33, 10, 31, 31, 13, 44,  7
  1196.         DB  15, 47,  7, 16, 50,  8, 17, 53,  9, 40, 22, 13
  1197.  
  1198. ;        DB 768-($-NormalPalette) DUP(0)
  1199.  
  1200. EmptyPalette DB 768 DUP(0)   
  1201.  
  1202. SpiralPalette DB 2*50*3 DUP(0)
  1203.  
  1204. SpiralPos1 DB 0
  1205. SpiralPos2 DB 0
  1206. FadeData1  DW 0, 0, 0
  1207. FadeData2  DW 0, 0, 0
  1208.  
  1209. WorkSecondPal DB 1
  1210.  
  1211. PixelationSkipOffset DW 0
  1212.  
  1213. FirstPalRot  DW OFFSET PalInc
  1214. SecondPalRot DW OFFSET PalInc
  1215.  
  1216. SpecialSecondPal DW 0
  1217.  
  1218. SpiralPosRotList LABEL WORD
  1219.         INCLUDE SpiPoss.INC
  1220. EndSpiralPosRot LABEL WORD
  1221.  
  1222. SpiralPosRot DW OFFSET SpiralPosRotList
  1223.  
  1224. ;           OFF,size
  1225. SpiPosScr0 DW 0, 57
  1226. SpiPosScr1 DW 0, 1
  1227. SpiPosScr2 DW 0, 1
  1228.  
  1229.  
  1230.         END
  1231. ; ------------------------ End of SPI.ASM ---------------------------
  1232.  
  1233.